var input = [1, 2];
var first = input[0], second = input[1];
// let [first, second] =[1, 2];
console.log(first); // outputs 1
console.log(second); // outputs 2

first = input[0];
second = input[1];
/*let index : {name?: string, table?: string};
index.name = 'xasss';
console.log(index.name);*/

// 类型检查器会查看printLabel的调用。 printLabel有一个参数，并要求这个对象参数有一个名为label类型为string的属性。
// 需要注意的是，我们传入的对象参数实际上会包含很多属性，但是编译器只会检查那些必需的属性是否存在，并且其类型是否匹配。
// 然而，有些时候TypeScript却并不会这么宽松，我们下面会稍做讲解。

function printLabel1(labelledObj: { label: string }) {
    console.log(labelledObj.label);
}

let myObj1 = {size: 10, label: "Size 10 Object"};
printLabel1(myObj1);


/*
    LabelledValue接口就好比一个名字，用来描述上面例子里的要求。
    它代表了有一个 label属性且类型为string的对象。 需要注意的是，我们在这里并不能像在其它语言里一样，
    说传给 printLabel的对象实现了这个接口。我们只会去关注值的外形。 只要传入的对象满足上面提到的必要条件，那么它就是被允许的。
    还有一点值得提的是，类型检查器不会去检查属性的顺序，只要相应的属性存在并且类型也是对的就可以。
*/
interface LabelledValue {
    label: string;
}

function printLabel(labelledObj: LabelledValue) {
    console.log(labelledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);


interface SquareConfig {
    color?: string;
    width?: number;
}

function createSquare(config: SquareConfig): { color: string; area: number } {
    let newSquare = {color: "white", area: 100};
    if (config.color) {
        newSquare.color = config.color;
    }
    if (config.width) {
        newSquare.area = config.width * config.width;
    }
    return newSquare;
}

let mySquare = createSquare({color: "black"});

console.log(mySquare.area);

function fix(): { baby: string, table: string } {
    return {baby: 'test', table: 'tetx'};
}

interface Point {
    readonly x: number;
    readonly y: number;
}

let p1: Point = {x: 10, y: 20};
// p1.x = 5; // error!

/*实例化接口*/
let s1: SquareConfig = {color: '10', width: 100};
s1.color = 'xx';
console.log(s1.color);

class index {
    index?: string;
    body?: string;

    constructor(public name?: string) {

    }
}

/*构造器声明的变量，直接作为属性值可调用*/
let i: index = {body: 'x', index: 'y', name: 'x'};
console.log(i.index);

let i2: index = new index('x');
i2.index = "index";

console.log(i2.index);
console.log(i2.body);

let i3: index = {body: 'x'};
console.log(i.index);

/*TypeScript具有ReadonlyArray<T>类型，它与Array<T>相似，只是把所有可变方法去掉了，因此可以确保数组创建后再也不能被修改：*/
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
// ro[0] = 12; // error!
// ro.push(5); // error!
// ro.length = 100; // error!
// a = ro; // error!